﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SQLite;
using KProject.Model;

namespace KProject.DAL
{
    static class GruposJuradosDAL
    {
        public static List<GrupoJurados> List(int idConcurso)
        {
            SQLiteCommand cmd = new SQLiteCommand("select * from GrupoJurados where idConcurso = @idConcurso");
            cmd.Parameters.Add("@idConcurso", DbType.Int32).Value = idConcurso;

            SQLiteCommand cmdJurado = new SQLiteCommand(@"select g.idGrupoJurados, j.idJurado, nomeJurado
                                                            from GrupoJurados g, Jurado_Grupo jg, Jurado j
                                                           where g.idGrupoJurados = jg.idGrupoJurados
                                                             and j.idJurado = jg.idJurado
                                                        order by g.idGrupoJurados, ordemJurado");

            DataTable jurados = CommonDAL.ExecuteDataTable(cmdJurado);

            return CommonDAL.List(cmd, dr => new GrupoJurados()
            {
                Id = Convert.ToInt32(dr["idGrupoJurados"]),
                Nome = dr["nomeGrupoJurados"].ToString(),
                Jurados = (from jur in jurados.Select("idGrupoJurados = " + dr["idGrupoJurados"].ToString())
                           select new Jurado()
                           {
                               Id = Convert.ToInt32(jur["idJurado"]),
                               Nome = jur["nomeJurado"].ToString()
                           }).ToList()
            });
        }

        public static int Insert(string nome, List<Jurado> jurados, int idConcurso)
        {
            int id;

            List<SQLiteCommand> cmds = new List<SQLiteCommand>();

            SQLiteCommand cmd = new SQLiteCommand(@"insert into GrupoJurados (nomeGrupoJurados, idConcurso)
                                                    values (@nomeGrupoJurados, @idConcurso);");
            cmd.Parameters.Add("@nomeGrupoJurados", DbType.String, 100).Value = nome;
            cmd.Parameters.Add("@idConcurso", DbType.Int32).Value = idConcurso;
            cmds.Add(cmd);

            cmd = new SQLiteCommand("select last_insert_rowid() from GrupoJurados;");
            cmds.Add(cmd);

            id = Convert.ToInt32(CommonDAL.ExecuteTransaction(cmds, 1));

            cmds = new List<SQLiteCommand>();

            StringBuilder stringCommand = null;
            for (int i = 0; i < jurados.Count; i++)
            {
                stringCommand = new StringBuilder();
                stringCommand.Append("insert into Jurado_Grupo (idGrupoJurados, idJurado, ordemJurado) values (");
                stringCommand.Append(id);
                stringCommand.Append(", ");
                stringCommand.Append(jurados[i].Id);
                stringCommand.Append(", ");
                stringCommand.Append(i+1);
                stringCommand.Append(");");

                cmds.Add(new SQLiteCommand(stringCommand.ToString()));
            }

            CommonDAL.ExecuteTransaction(cmds);

            return id;
        }

        public static void Save(int id, string nome, List<Jurado> jurados)
        {
            List<SQLiteCommand> cmds = new List<SQLiteCommand>();

            SQLiteCommand cmd = new SQLiteCommand("update GrupoJurados set nomeGrupoJurados = @nomeGrupoJurados where idGrupoJurados = @idGrupoJurados;");
            cmd.Parameters.Add("@nomeGrupoJurados", DbType.String, 100).Value = nome;
            cmd.Parameters.Add("@idGrupoJurados", DbType.Int16).Value = id;

            cmds.Add(cmd);

            cmd = new SQLiteCommand("delete from Jurado_Grupo where idGrupoJurados = @idGrupoJurados;");
            cmd.Parameters.Add("@idGrupoJurados", DbType.Int16).Value = id;

            cmds.Add(cmd);

            StringBuilder stringCommand = null;
            for (int i = 0; i < jurados.Count; i++)
            {
                stringCommand = new StringBuilder();
                stringCommand.Append("insert into Jurado_Grupo (idGrupoJurados, idJurado, ordemJurado) values (");
                stringCommand.Append(id);
                stringCommand.Append(", ");
                stringCommand.Append(jurados[i].Id);
                stringCommand.Append(", ");
                stringCommand.Append(i + 1);
                stringCommand.Append(");");

                cmds.Add(new SQLiteCommand(stringCommand.ToString()));
            }

            CommonDAL.ExecuteTransaction(cmds);
        }

        public static int VerifyCategoria(int id)
        {
            SQLiteCommand cmd = new SQLiteCommand("select count(*) from Categoria where idGrupoJurados = @idGrupoJurados;");
            cmd.Parameters.Add("@idGrupoJurados", DbType.Int32).Value = id;

            return Convert.ToInt32(CommonDAL.ExecuteScalar(cmd));
        }

        public static int Remove(int? id)
        {
            SQLiteCommand cmd = new SQLiteCommand("delete from GrupoJurados where idGrupoJurados = @idGrupoJurados");
            cmd.Parameters.Add("@idGrupoJurados", DbType.Int32).Value = id;

            return CommonDAL.ExecuteNonQuery(cmd);
        }
    }
}
